package de.fhhannover.inform.hnefatafl.spiel;

import java.util.Observable;
import de.fhhannover.inform.hnefatafl.strategy.G15_Strategy;
import de.fhhannover.inform.hnefatafl.strategy.StrategyHandler;
import de.fhhannover.inform.hnefatafl.vorgaben.BoardContent;
import de.fhhannover.inform.hnefatafl.vorgaben.Cell;
import de.fhhannover.inform.hnefatafl.vorgaben.Move;
import de.fhhannover.inform.hnefatafl.vorgaben.MoveStrategy;

public class Board extends Observable{
	
	public MoveStrategy	attacker,
						defender;
	public Logger		logger;
	public MoveChecker	moveChecker;
	int 				thinkingTime,
						roundCounter;
	private boolean 	isAttackerHuman,
	 					isDefenderHuman,
	 					isAttackersTurn,
	 					isGameRunning,
	 					attackerWon,
	 					defenderWon;
	private Move		lastMove;
	private Field 		board[][];
	private Cell		temp,
	 					source, 
	 					destination;
	
	
	
	public Board(){
		board 		= new Field[15][15];
		lastMove	= null;
		logger		= new Logger();
		moveChecker = new MoveChecker();
	}
	
	public void initialGame(String attackerName, boolean isAttackerHuman,
			String defenderName, boolean isDefenderHuman, int thinkingTime, int attackerKI, int defenderKI){
		
		this.isAttackerHuman 	= isAttackerHuman;
		this.isDefenderHuman 	= isDefenderHuman;
		this.thinkingTime 		= thinkingTime;
		attackerWon				= false;
		defenderWon				= false;
		isAttackersTurn			= true;
		roundCounter			= 1;
		
		if(attackerKI != -1 && isAttackerHuman == false){
			attacker = (MoveStrategy) StrategyHandler.getInstance().getStrategyByPathIndex(attackerKI);
		}
		
		if(attackerKI == -1 && isAttackerHuman == false){
			attacker = new G15_Strategy();
		}
		
		if(defenderKI != -1 && isDefenderHuman == false){
			defender = (MoveStrategy) StrategyHandler.getInstance().getStrategyByPathIndex(defenderKI);
		}
		
		if(defenderKI == -1 && isDefenderHuman == false){
			defender = new G15_Strategy();
		}
		
		fillBoard();
		logger.deleteFile();
		logger.writeToFile("Spiel wurde gestartet.");
		
		super.setChanged();
		super.notifyObservers(this);
		
		isGameRunning			= true;
	}
	
	//hier wird das Spielfelder gefuellt 
	private void fillBoard(){
		for(int i = 0; i < 15; i++){
			//Attacker
			for(int j = 0; j < 15; j++){
				if((i == 1 && j == 5)||(i == 1 && j == 6)||(i == 1 && j == 7)||(i == 1 && j == 8)||(i == 1 && j == 9)||
				   (i == 2 && j == 7)||
				   (i == 5 && j == 1)||(i == 5 && j == 13)||
				   (i == 6 && j == 1)||(i == 6 && j == 13)||
				   (i == 7 && j == 1)||(i == 7 && j == 2)||(i == 7 && j == 12)||(i == 7 && j == 13)||
				   (i == 8 && j == 1)||(i == 8 && j == 13)||
				   (i == 9 && j == 1)||(i == 9 && j == 13)||
				   (i == 12 && j == 7)||
				   (i == 13 && j == 5)||(i == 13 && j == 6)||(i == 13 && j == 7)||(i == 13 && j == 8)||(i == 13 && j == 9)){
				this.board[i][j] = new Field(j-1,i-1,BoardContent.ATTACKER);
				//Deffender
				}else if((i == 5 && j == 7)||
						 (i == 6 && j == 6)||(i == 6 && j == 7)||(i == 6 && j == 8)||
						 (i == 7 && j == 5)||(i == 7 && j == 6)||(i == 7 && j == 8)||(i == 7 && j == 9)||
						 (i == 8 && j == 6)||(i == 8 && j == 7)||(i == 8 && j == 8)||
						                                           (i == 9 && j == 7)){
					this.board[i][j] = new Field(j-1,i-1,BoardContent.DEFENDER);
				//King
				}else if((i == 7 && j == 7)){
					this.board[i][j] = new Field(j-1,i-1,BoardContent.KING);
				//Empty
				}else if(  (i == 1 && j == 1) ||(i == 1 && j == 2) ||(i == 1 && j == 3)  ||(i == 1 && j == 4)||
						   (i == 1 && j == 10) ||(i == 1 && j == 11)||(i == 1 && j == 12) ||(i == 1 && j == 13)||
						   (i == 2 && j == 1) ||(i == 2 && j == 2) ||(i == 2 && j == 3)  ||(i == 2 && j == 4)||(i == 2 && j == 5)||(i == 2 && j == 6)||
						   (i == 2 && j == 8) ||(i == 2 && j == 9) ||(i == 2 && j == 10)  ||(i == 2 && j == 11)||(i == 2 && j == 12)||(i == 2 && j == 13)||
						   (i == 3 && j == 1) ||(i == 3 && j == 2) ||(i == 3 && j == 3)  ||(i == 3 && j == 4)||(i == 3 && j == 5)||(i == 3 && j == 6)||
						   (i == 3 && j == 7) ||(i == 3 && j == 8) ||(i == 3 && j == 9)  ||(i == 3 && j == 10)||(i == 3 && j == 11)||(i == 3 && j == 12)||(i == 3 && j == 13)||
						   (i == 4 && j == 1) ||(i == 4 && j == 2) ||(i == 4 && j == 3)  ||(i == 4 && j == 4)||(i == 4 && j == 5)||(i == 4 && j == 6)||
						   (i == 4 && j == 7) ||(i == 4 && j == 8) ||(i == 4 && j == 9)  ||(i == 4 && j == 10)||(i == 4 && j == 11)||(i == 4 && j == 12)||(i == 4 && j == 13)||
						   (i == 5 && j == 2) ||(i == 5 && j == 3) ||(i == 5 && j == 4)  ||(i == 5 && j == 5)||(i == 5 && j == 6)||
						   (i == 5 && j == 8) ||(i == 5 && j == 9) ||(i == 5 && j == 10)  ||(i == 5 && j == 11)||(i == 5 && j == 12)||
						   (i == 6 && j == 2) ||(i == 6 && j == 3) ||(i == 6 && j == 4)  ||(i == 6 && j == 5)||
						   (i == 6 && j == 9) ||(i == 6 && j == 10) ||(i == 6 && j == 11) ||(i == 6 && j == 12)||
						   (i == 7 && j == 3) ||(i == 7 && j == 4) ||(i == 7 && j == 10)  ||(i == 7 && j == 11)||
						   (i == 8 && j == 2) ||(i == 8 && j == 3) ||(i == 8 && j == 4)  ||(i == 8 && j == 5)||
						   (i == 8 && j == 9) ||(i == 8 && j == 10) ||(i == 8 && j == 11) ||(i == 8 && j == 12)||
						   (i == 9 && j == 2) ||(i == 9 && j == 3) ||(i == 9 && j == 4)  ||(i == 9 && j == 5)||(i == 9 && j == 6)||
						   (i == 9 && j == 8) ||(i == 9 && j == 9) ||(i == 9 && j == 10)  ||(i == 9 && j == 11)||(i == 9 && j == 12)||
						   (i == 10 && j == 1) ||(i == 10 && j == 2) ||(i == 10 && j == 3)  ||(i == 10 && j == 4)||(i == 10 && j == 5)||(i == 10 && j == 6)||
						   (i == 10 && j == 7) ||(i == 10 && j == 8) ||(i == 10 && j == 9)  ||(i == 10 && j == 10)||(i == 10 && j == 11)||(i == 10 && j == 12)||(i == 10 && j == 13)||
						   (i == 11 && j == 1)||(i == 11 && j == 2)||(i == 11 && j == 3) ||(i == 11 && j == 4)||(i == 11 && j == 5)||(i == 11 && j == 6)||
						   (i == 11 && j == 7)||(i == 11 && j == 8)||(i == 11 && j == 9) ||(i == 11 && j == 10)||(i == 11 && j == 11)||(i == 11 && j == 12)||(i == 11 && j == 13)||
						   (i == 12 && j == 1)||(i == 12 && j == 2)||(i == 12 && j == 3) ||(i == 12 && j == 4)||(i == 12 && j == 5)||(i == 12 && j == 6)||
						   (i == 12 && j == 8)||(i == 12 && j == 9)||(i == 12 && j == 10) ||(i == 12 && j == 11)||(i == 12 && j == 12)||(i == 12 && j == 13)||
						   (i == 13 && j == 1)||(i == 13 && j == 2)||(i == 13 && j == 3) ||(i == 13 && j == 4)||
						   (i == 13 && j == 10)||(i == 13 && j == 11)||(i == 13&& j == 12)||(i == 13 && j == 13)){
					this.board[i][j] = new Field(j-1,i-1,BoardContent.EMPTY);
				//Invalid
				}else if(i == 0 && j == 0 || i == 0 && j == 1 || i == 0 && j == 2 || i == 0 && j == 3 || i == 0 && j == 4 || i == 0 && j == 5||
						 i == 0 && j == 6 || i == 0 && j == 7 || i == 0 && j == 8 || i == 0 && j == 9 || i == 0 && j == 9 || i == 0 && j == 10||
						 i == 0 && j == 11 || i == 0 && j == 12 || i == 0 && j == 13 || i == 0 && j == 14||
						 i == 1 && j == 0 || i == 1 && j == 14||
						 i == 2 && j == 0 || i == 2 && j == 14||
						 i == 3 && j == 0 || i == 3 && j == 14||
						 i == 4 && j == 0 || i == 4 && j == 14||
						 i == 5 && j == 0 || i == 5 && j == 14||
						 i == 6 && j == 0 || i == 6 && j == 14||
						 i == 7 && j == 0 || i == 7 && j == 14||
						 i == 8 && j == 0 || i == 8 && j == 14||
						 i == 9 && j == 0 || i == 9 && j == 14||
						 i == 10 && j == 0 || i == 10 && j == 14||
						 i == 11 && j == 0 || i == 11 && j == 14||
						 i == 12 && j == 0 || i == 12 && j == 14||
						 i == 13 && j == 0 || i == 13 && j == 14||
						 i == 14 && j == 0 || i == 14 && j == 1 || i == 14 && j == 2 || i == 14 && j == 3 || i == 14 && j == 4 || i == 14 && j == 5||
						 i == 14 && j == 6 || i == 14 && j == 7 || i == 14 && j == 8 || i == 14 && j == 9 || i == 14 && j == 9 || i == 14 && j == 10||
						 i == 14 && j == 11 || i == 14 && j == 12 || i == 14 && j == 13 || i == 14 && j == 14){
					this.board[i][j] = new Field(j-1,i-1,BoardContent.INVALID);
				}
			}
		}
	}
	
	//kontrolliert ueber MoveChecker ob der zug ordnungsgemaess ist,
	//wenn Ja, dann wird der zug durchgefuehrt und per Observer wird
	//das GamePanel benachichtigt.
	public void makeMove(Move move){
		
	   source =  move.getFromCell();
	   destination =  move.getToCell();
		
	   if(isGameRunning == true){
			
		if(moveChecker.possibleMoves(isAttackersTurn, board).isEmpty() == false){	
			
		  if(moveChecker.checkMove(isAttackersTurn,move,board)){
			  
			lastMove = move;
			
			temp = new Field(source.getRow()+1,source.getCol()+1,board[source.getRow()+1][source.getCol()+1].getContent());
		
			board[source.getRow()+1][source.getCol()+1].setContent(board[destination.getRow()+1][destination.getCol()+1].getContent());
			board[destination.getRow()+1][destination.getCol()+1].setContent(temp.getContent());
			
			if(isAttackersTurn == true){
				logger.writeToFile("Zug "+roundCounter+": Angreifer zog von Feld "+source+" nach Feld "+destination);
			}
			if(isAttackersTurn == false){
				logger.writeToFile("Zug "+roundCounter+": Verteidiger zog von Feld "+source+" nach Feld "+destination);
			}
			checkNeighbor();
			roundControll();
		
			super.setChanged();
			super.notifyObservers(this);
		}
	  }
	 }
		else{
			logger.writeToFile("Fehler: Das Spiel wurde bereits entschieden oder es sind keine Zuege mehr moeglich.");
			super.setChanged();
			super.notifyObservers(this);
		}
	}
	
	private void checkNeighbor(){
		checkOut();
		checkIn();
		checkPlace();
	}

	//Wechselt den Spieler nach einem Zug
	private void roundControll(){
		if(isAttackersTurn == true){
			isAttackersTurn = false;
			roundCounter++;
		}else{
			isAttackersTurn = true;
			roundCounter++;
		}
	}
	
	//beim zug von einem Feld weg,werden die boolean werte der nachbarn entsprechen geaendert. 
	private void checkOut(){
		if(isAttackersTurn){
			//West
			if((board[source.getRow()+1][source.getCol()].getContent() == BoardContent.DEFENDER)||
			   (board[source.getRow()+1][source.getCol()].getContent() == BoardContent.KING)){
				board[source.getRow()+1][source.getCol()].hasEnemyEast = false;
			}
			//Ost
			if((board[source.getRow()+1][source.getCol()+2].getContent() == BoardContent.DEFENDER)||
			   (board[source.getRow()+1][source.getCol()+2].getContent() == BoardContent.KING)){
				board[source.getRow()+1][source.getCol()+2].hasEnemyWest = false;
			}
			//Nord
			if((board[source.getRow()][source.getCol()+1].getContent() == BoardContent.DEFENDER)||
			   (board[source.getRow()][source.getCol()+1].getContent() == BoardContent.KING)){
				board[source.getRow()][source.getCol()+1].hasEnemySouth = false;
			}
			//Sued
			if((board[source.getRow()+2][source.getCol()+1].getContent() == BoardContent.DEFENDER)||
			   (board[source.getRow()+2][source.getCol()+1].getContent() == BoardContent.DEFENDER)){
				board[source.getRow()+2][source.getCol()+1].hasEnemyNorth = false;
			}
		}
		else{
			//West
			if(board[source.getRow()+1][source.getCol()].getContent() == BoardContent.ATTACKER){
				board[source.getRow()+1][source.getCol()].hasEnemyEast = false;
			}
			//Ost
			if(board[source.getRow()+1][source.getCol()+2].getContent() == BoardContent.ATTACKER){
				board[source.getRow()+1][source.getCol()+2].hasEnemyWest = false;
			}
			//Nord
			if(board[source.getRow()][source.getCol()+1].getContent() == BoardContent.ATTACKER){
				board[source.getRow()][source.getCol()+1].hasEnemySouth = false;
			}
			//Sued
			if(board[source.getRow()+2][source.getCol()+1].getContent() == BoardContent.ATTACKER){
				board[source.getRow()+2][source.getCol()+1].hasEnemyNorth = false;
			}
		}
	}
	
	
	private void checkIn(){
		
		//versetzt den zu ziehenden Stein in ursprungszustand
		board[destination.getRow()+1][destination.getCol()+1].setDefault();
		
		//Angreifer bewegt sich auf Feld
		if(isAttackersTurn == true){
			//Westliches Feld hat Verteidiger
			if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.DEFENDER){
				board[destination.getRow()+1][destination.getCol()].hasEnemyEast = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
			}
			//Westliches Feld hat Koenig
			if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.KING){
				board[destination.getRow()+1][destination.getCol()].hasEnemyEast = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
			}
			//Westliches Feld ist Turm oder leerer Thron (nur Thronfelder 0,0 oder 0,12 moeglich)
			if(destination.getRow() ==  0 && destination.getCol()-1 == 0 ||
			   destination.getRow() == 12 && destination.getCol()-1 == 0 ||
			   destination.getRow() ==  6 && destination.getCol()-1 == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
			}
			//---------------------------------------------------------------------------------------
			//Oestliches Feld hat Verteidiger
			if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.DEFENDER){
				board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
			}
			//Oestliches Feld hat Koenig
			if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.KING){
				board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
			}
			//Oestliches Feld ist Turm oder leerer Thron (nur Thronfelder 12,0 oder 12,12 moeglich)
			if(destination.getRow() ==  0 && destination.getCol()+1 == 12 ||
			   destination.getRow() == 12 && destination.getCol()+1 == 12 ||
			   destination.getRow() ==  6 && destination.getCol()+1 == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
			}
			//--------------------------------------------------------------------------------
			//Noerdliches Feld hat Verteidiger
			if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.DEFENDER){
				board[destination.getRow()][destination.getCol()+1].hasEnemySouth = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
			}
			//Noerliches Feld hat Koenig
			if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.KING){
				board[destination.getRow()][destination.getCol()+1].hasEnemySouth = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
			}
			//Noerdliches Feld ist Turm oder leerer Thron (nur Thronfelder 0,0 oder 12,0 moeglich)
			if(destination.getRow()-1 ==  0 && destination.getCol() == 0 ||
			   destination.getRow()-1 ==  0 && destination.getCol() == 12 ||
			   destination.getRow()-1 ==  6 && destination.getCol() == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
			}
			//---------------------------------------------------------------------------------
			//Suedliches Feld hat Verteidiger
			if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.DEFENDER){
				board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
				}
			//Suedliches Feld hat Koenig
			if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.KING){
				board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
				}
			//Suedliches Feld ist Turm oder leerer Thron (nur Thronfelder 0,12 oder 12,12 moeglich)
			if(destination.getRow()+1 == 12 && destination.getCol() == 0 ||
			   destination.getRow()+1 == 12 && destination.getCol() == 12 ||
			   destination.getRow()+1 ==  6 && destination.getCol() == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
			}
		}
		//Verteidiger bewegt sich auf Feld
		if(isAttackersTurn == false && board[destination.getRow()+1][destination.getCol()+1].getContent() == BoardContent.DEFENDER){
			//Westliches Feld hat Angreifer
			if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.ATTACKER){
				board[destination.getRow()+1][destination.getCol()].hasEnemyEast = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
			}
			//Westliches Feld ist Turm oder leerer Thron (nur Thronfelder 0,0 oder 0,12 moeglich)
			if(destination.getRow() ==  0 && destination.getCol()-1 == 0 ||
			   destination.getRow() == 12 && destination.getCol()-1 == 0 ||
			   destination.getRow() ==  6 && destination.getCol()-1 == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
			}
			//---------------------------------------------------------------------------------------
			//Ost
			if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.ATTACKER){
				board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
			}
			//Oestliches Feld ist Turm oder leerer Thron (nur Thronfelder 12,0 oder 12,12 moeglich)
			if(destination.getRow() ==  0 && destination.getCol()+1 == 12 ||
			   destination.getRow() == 12 && destination.getCol()+1 == 12 ||
			   destination.getRow() ==  6 && destination.getCol()+1 == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
			}
			//--------------------------------------------------------------------------------------------
			//Nord
			if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.ATTACKER){
				board[destination.getRow()][destination.getCol()+1].hasEnemySouth = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
			}
			//Noerdliches Feld ist Turm oder leerer Thron (nur Thronfelder 0,0 oder 12,0 moeglich)
			if(destination.getRow()-1 ==  0 && destination.getCol() == 0 ||
			   destination.getRow()-1 ==  0 && destination.getCol() == 12 ||
			   destination.getRow()-1 ==  6 && destination.getCol() == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
			}
			//----------------------------------------------------------------------------------------------
			//Sued
			if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.ATTACKER){
				board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth = true;
				board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
			}
			//Suedliches Feld ist Turm oder leerer Thron (nur Thronfelder 0,12 oder 12,12 moeglich)
			if(destination.getRow()+1 == 12 && destination.getCol() == 0 ||
			   destination.getRow()+1 == 12 && destination.getCol() == 12 ||
			   destination.getRow()+1 ==  6 && destination.getCol() == 6 && board[6+1][6+1].getContent() == BoardContent.EMPTY){
				board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
			}
		}
			//--------------------------------------------------------------------------------------------
		//Koenig bewegt sich auf Feld
		if(isAttackersTurn == false && board[destination.getRow()+1][destination.getCol()+1].getContent() == BoardContent.KING){
			
			//Koenig erreicht den sicheren Turm
			if(board[destination.getRow()+1][destination.getCol()+1].getContent() == BoardContent.KING){
				if((destination.getCol() == 0 && destination.getRow() == 0)||
				   (destination.getCol() == 12 && destination.getRow() == 0)||
				   (destination.getCol() == 0 && destination.getRow() == 12)||
				   (destination.getCol() == 12 && destination.getRow() == 12)){
						defenderWon = true;
						logger.writeToFile("Info: Koenig hat Turmposition "+board[destination.getRow()+1][destination.getCol()+1]+" erreicht, Die Verteidiger haben Gewonnen.");
						logger.writeToFile("Info: Das Spiel wurde in "+roundCounter+" Spielzuegen entschieden.");
						logger.writeToFile("Herzlichen Glueckwunsch.");
						isGameRunning = false;
				}
				
				//Westliches Feld ist Angreifer
				if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.ATTACKER){
					board[destination.getRow()+1][destination.getCol()].hasEnemyEast = true;
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
				}
				//Westliches Feld ist Spielfeldrand oder Thron
				if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.INVALID ||
				  (destination.getRow() == 6 && destination.getCol()-1 == 6)){
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = true;
				}
				//Oestliches Feld ist Angreifer
				if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.ATTACKER){
					board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest = true;
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
				}
				//Oestliches Feld ist Spielfeldrand oder Thron
				if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.INVALID ||
				  (destination.getRow() == 6 && destination.getCol()+1 == 6)){
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyEast = true;
				}
				//Noerdliches Feld ist Angreifer
				if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.ATTACKER){
					board[destination.getRow()][destination.getCol()+1].hasEnemySouth = true;
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
				}
				//Noerdliches Feld ist Spielfeldrand oder Thron
				if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.INVALID ||
				  (destination.getRow()-1 == 6 && destination.getCol() == 6)){
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = true;
				}
				//Suedliches Feld ist Angreifer
				if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.ATTACKER){
					board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth = true;
					board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
				}
				//suedliches Feld ist Spielfeldrand
				if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.INVALID ||
				  (destination.getRow()+1 == 6 && destination.getCol() == 6)){
					board[destination.getRow()+1][destination.getCol()+1].hasEnemySouth = true;
				}
			}
		}
	}
	
	
	//pr�ft ob benachbarte Steine geschlagen sind
	private void checkPlace(){
		//Oestlicher Stein ist Koenig
		if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.KING){
			//Koenig hat Gegner im NORDEN, SUEDEN, WESTEN und OSTEN
			if(board[destination.getRow()+1][destination.getCol()+2].hasEnemyEast == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemyNorth == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemySouth == true){
				//geschlagenen Stein Empty setzen.
				board[destination.getRow()+1][destination.getCol()+2].setContentEmpty();
				//Info das der Koenig gefangen genommen wurde und Spiel stoppen
				logger.writeToFile("Info: Der Koenig wurde auf Feld "+board[destination.getRow()+1][destination.getCol()+2]+" gefangen genommen.");
				logger.writeToFile("Info: Das Spiel wurde in "+roundCounter+" Spielzuegen entschieden.");
				logger.writeToFile("Herzlichen Glueckwunsch.");
				attackerWon 	= true;
				isGameRunning	= false;
			}
		}
		//Oesticher Stein ist Verteidiger
		if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.DEFENDER){
			//Verteidiger hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()+1][destination.getCol()+2].hasEnemyEast == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest == true){
				
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()+2].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()+2]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()+2-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+2+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()+2].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()+2].hasEnemyNorth = false;//Sueden
			}
			//Verteidiger hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()+1][destination.getCol()+2].hasEnemyNorth == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemySouth == true){
					
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()+2].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()+2]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()+2-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+2+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()+2].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()+2].hasEnemyNorth = false;//Sueden
				}
		}
		//Oestlicher Stein ist Angreifer
		if(board[destination.getRow()+1][destination.getCol()+2].getContent() == BoardContent.ATTACKER){
			//Angreifer hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()+1][destination.getCol()+2].hasEnemyEast == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemyWest == true){
						
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()+2].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()+2]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()+2-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+2+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()+2].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()+2].hasEnemyNorth = false;//Sueden
			}
			//Angreifer hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()+1][destination.getCol()+2].hasEnemyNorth == true&&
			   board[destination.getRow()+1][destination.getCol()+2].hasEnemySouth == true){
							
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()+2].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()+2]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()+2-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+2+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()+2].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()+2].hasEnemyNorth = false;//Sueden
				}
		}
		//---------------------------------------------------------------------------------------------------
		//Westlicher Stein ist Koenig
		if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.KING){
			//Koenig hat Gegner im NORDEN, SUEDEN, WESTEN und OSTEN
			if(board[destination.getRow()+1][destination.getCol()].hasEnemyEast == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemyWest == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemyNorth == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemySouth == true){
				//geschlagenen Stein Empty setzen.
				board[destination.getRow()+1][destination.getCol()].setContentEmpty();
				//Info das der Koenig gefangen genommen wurde und Spiel stoppen
				logger.writeToFile("Info: Der Koenig wurde auf Feld "+board[destination.getRow()+1][destination.getCol()]+" gefangen genommen.");
				logger.writeToFile("Info: Das Spiel wurde in "+roundCounter+" Spielzuegen entschieden.");
				logger.writeToFile("Herzlichen Glueckwunsch.");
				attackerWon 	= true;
				isGameRunning	= false;
			}
		}
		//Westlicher Stein ist Verteidiger
		if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.DEFENDER){
			//Verteidiger hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()+1][destination.getCol()].hasEnemyEast == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemyWest == true){
				
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()].hasEnemyNorth = false;//Sueden
			}
			//Verteidiger hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()+1][destination.getCol()].hasEnemyNorth == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemySouth == true){
					
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()].hasEnemyNorth = false;//Sueden
				}
		}
		//Westlicher Stein ist Angreifer
		if(board[destination.getRow()+1][destination.getCol()].getContent() == BoardContent.ATTACKER){
			//Angreifer hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()+1][destination.getCol()].hasEnemyEast == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemyWest == true){
						
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()].hasEnemyNorth = false;//Sueden
			}
			//Angreifer hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()+1][destination.getCol()].hasEnemyNorth == true&&
			   board[destination.getRow()+1][destination.getCol()].hasEnemySouth == true){
							
					//geschlagenen Stein Empty setzen.
					board[destination.getRow()+1][destination.getCol()].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+1][destination.getCol()-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+1-1][destination.getCol()].hasEnemySouth = false;//Norden
					board[destination.getRow()+1+1][destination.getCol()].hasEnemyNorth = false;//Sueden
				}
		}
		//---------------------------------------------------------------------------------------------------
		//Noerdlicher Stein ist Koenig
		if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.KING){
			//Koenig hat Gegner im NORDEN, SUEDEN, WESTEN und OSTEN
			if(board[destination.getRow()][destination.getCol()+1].hasEnemyEast == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemyWest == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemyNorth == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemySouth == true){
				//geschlagenen Stein Empty setzen.
				board[destination.getRow()][destination.getCol()+1].setContentEmpty();
				//Info das der Koenig gefangen genommen wurde und Spiel stoppen
				logger.writeToFile("Info: Der Koenig wurde auf Feld "+board[destination.getRow()][destination.getCol()+1]+" gefangen genommen.");
				logger.writeToFile("Info: Das Spiel wurde in "+roundCounter+" Spielzuegen entschieden.");
				logger.writeToFile("Herzlichen Glueckwunsch.");
				attackerWon 	= true;
				isGameRunning	= false;
			}
		}
		//Noerdlicher Stein ist Verteidiger
		if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.DEFENDER){
			//Verteidiger hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()][destination.getCol()+1].hasEnemyEast == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemyWest == true){
				
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()-1][destination.getCol()+1].hasEnemySouth = false;//Norden
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = false;//Sueden
			}
			//Verteidiger hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()][destination.getCol()+1].hasEnemyNorth == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemySouth == true){
					
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()-1][destination.getCol()+1].hasEnemySouth = false;//Norden
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = false;//Sueden
				}
		}
		//Noerdlicher Stein ist Angreifer
		if(board[destination.getRow()][destination.getCol()+1].getContent() == BoardContent.ATTACKER){
			//Angreifer hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()][destination.getCol()+1].hasEnemyEast == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemyWest == true){
						
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()-1][destination.getCol()+1].hasEnemySouth = false;//Norden
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = false;//Sueden
			}
			//Angreifer hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()][destination.getCol()+1].hasEnemyNorth == true&&
			   board[destination.getRow()][destination.getCol()+1].hasEnemySouth == true){
							
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()-1][destination.getCol()+1].hasEnemySouth = false;//Norden
					board[destination.getRow()+1][destination.getCol()+1].hasEnemyNorth = false;//Sueden
				}
		}
		//---------------------------------------------------------------------------------------------------
		//Suedlicher Stein ist Koenig
		if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.KING){
			//Koenig hat Gegner im NORDEN, SUEDEN, WESTEN und OSTEN
			if(board[destination.getRow()+2][destination.getCol()+1].hasEnemyEast == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemyWest == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemySouth == true){
				//geschlagenen Stein Empty setzen.
				board[destination.getRow()+2][destination.getCol()+1].setContentEmpty();
				//Info das der Koenig gefangen genommen wurde und Spiel stoppen
				logger.writeToFile("Info: Der Koenig wurde auf Feld "+board[destination.getRow()+2][destination.getCol()+1]+" gefangen genommen.");
				logger.writeToFile("Info: Das Spiel wurde in "+roundCounter+" Spielzuegen entschieden.");
				logger.writeToFile("Herzlichen Glueckwunsch.");
				attackerWon 	= true;
				isGameRunning	= false;
			}
		}
		//Suedlicher Stein ist Verteidiger
		if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.DEFENDER){
			//Verteidiger hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()+2][destination.getCol()+1].hasEnemyEast == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemyWest == true){
				
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()+2][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+2][destination.getCol()+1]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+2][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+2][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+2-1][destination.getCol()+1].hasEnemySouth= false;//Norden
					board[destination.getRow()+2+1][destination.getCol()+1].hasEnemyNorth= false;//Sueden
			}
			//Verteidiger hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemySouth == true){
					
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()+2][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+1][destination.getCol()]+" wurde geschlagen.");
					
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+2][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+2][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+2-1][destination.getCol()+1].hasEnemySouth= false;//Norden
					board[destination.getRow()+2+1][destination.getCol()+1].hasEnemyNorth= false;//Sueden
				}
		}
		//Suedlicher Stein ist Angreifer
		if(board[destination.getRow()+2][destination.getCol()+1].getContent() == BoardContent.ATTACKER){
			//Angreifer hat gegner im OSTEN und WESTEN
			if(board[destination.getRow()+2][destination.getCol()+1].hasEnemyEast == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemyWest == true){
						
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()+2][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+2][destination.getCol()+1]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+2][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+2][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+2-1][destination.getCol()+1].hasEnemySouth= false;//Norden
					board[destination.getRow()+2+1][destination.getCol()+1].hasEnemyNorth= false;//Sueden
			}
			//Angreifer hat gegner im NORDEN und SUEDEN
			if(board[destination.getRow()+2][destination.getCol()+1].hasEnemyNorth == true&&
			   board[destination.getRow()+2][destination.getCol()+1].hasEnemySouth == true){
							
					//geschlagenen Stein Empty setzen.
				    board[destination.getRow()+2][destination.getCol()+1].setContentEmpty();
					logger.writeToFile("Info: Spielfigur auf Feld "+board[destination.getRow()+2][destination.getCol()+1]+" wurde geschlagen.");
							
					//benachbarte Steine Boolean-Werte angleichen.
					board[destination.getRow()+2][destination.getCol()+1-1].hasEnemyEast = false;//Westen
					board[destination.getRow()+2][destination.getCol()+1+1].hasEnemyWest = false;//Osten
					board[destination.getRow()+2-1][destination.getCol()+1].hasEnemySouth= false;//Norden
					board[destination.getRow()+2+1][destination.getCol()+1].hasEnemyNorth= false;//Sueden
				}
		}
	}
	
	
	
	
	public Cell[][] getBoard(){
		return board;
	}
	
	public boolean getIsAttackersTurn(){
		return isAttackersTurn;
	}
	
	public boolean hasAttackerWon(){
		return attackerWon;
	}
	
	public boolean hasDefenderWon(){
		return defenderWon;
	}
	
	public Move getLastMove(){
		return lastMove;
	}
	
	public boolean getIsAttackerHuman(){
		return isAttackerHuman;
	}
	
	public boolean getIsDefenderHuman(){
		return isDefenderHuman;
	}
	
	public boolean getIsGameRunning(){
		return isGameRunning;
	}
	
	
}//Ende
